package com.divemotor.ventarepuestosinternet.model;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.annotations.ForeignKey;

import com.divemotor.ventarepuestosinternet.util.Constantes;

@Entity
@Table(name = "GEN_MAE_SUCURSAL")
@NamedQueries({
	@NamedQuery(name="Sucursal.porProvinciaAdapter", query="SELECT new com.divemotor.ventarepuestosinternet.beans.adapter.DataAdapter(s.idSucursal, s.nombre) " +
													"FROM Sucursal s where s.provincia.idProvincia = :idProvincia AND s.esVentaRepuestos = :esVentaRepuestos AND s.estado = :estado"),
	@NamedQuery(name="Sucursal.dataAdapter", query="SELECT new com.divemotor.ventarepuestosinternet.beans.adapter.DataAdapter(s.idSucursal, s.nombre) " +
												   "FROM Sucursal s WHERE s.pais = :pais AND s.esVentaRepuestos = :esVentaRepuestos AND s.estado = :estado")
})
public class Sucursal implements Serializable {

	private static final long serialVersionUID = -5847353024649048827L;

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN_MAE_SUCURSAL")
	@SequenceGenerator(name = "SEQ_GEN_MAE_SUCURSAL", sequenceName = "GENERICO.SEQ_GEN_MAE_SUCURSAL", allocationSize = 0)
	@Column(name = "COD_ID_SUCURSAL")
	private Integer idSucursal;
	@Column(name = "COD_SAP", length = 10)
	private String codigo;
	@Column(name = "DES_NOMBRE", length = 50)
	private String nombre;
	@Column(name = "TXT_DIRECCION", length = 150)
	private String direccion;
	@Column(name = "TXT_TELEFONO", length = 9)
	private String telefono;
	@Column(name = "IND_ES_TALLER", length = 1)
	private String esTaller;
	@Column(name = "IND_VENTA_REPUESTOS")
	private String esVentaRepuestos;
	@Column(name = "IND_VENTA_VEHICULOS")
	private String esVentaVehiculos;
	@Column(name = "IND_ESTADO", length = 1)
	private String estado;
	@Column(name = "fec_creacion")
	@Temporal(TemporalType.DATE)
	private Date fechaCreacion;
	@Column(name = "fec_modificacion")
	@Temporal(TemporalType.DATE)
	private Date fechaModificacion;
	@Column(name = "fec_eliminacion")
	@Temporal(TemporalType.DATE)
	private Date fechaEliminacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "cod_id_usuario_creacion", referencedColumnName = "cod_id_usuario")
	@ForeignKey(name = "GEN_MAE_SUCURSAL_FK05")
	private Usuario usuarioCreacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "cod_id_usuario_modificacion", referencedColumnName = "cod_id_usuario")
	@ForeignKey(name = "GEN_MAE_SUCURSAL_FK06")
	private Usuario usuarioModificacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "cod_id_usuario_eliminacion", referencedColumnName = "cod_id_usuario")
	@ForeignKey(name = "GEN_MAE_SUCURSAL_FK07")
	private Usuario usuarioEliminacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "cod_id_pais")
	@ForeignKey(name = "GEN_MAE_SUCURSAL_FK01")
	private Pais pais;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "cod_id_departamento")
	@ForeignKey(name = "GEN_MAE_SUCURSAL_FK02")
	private Departamento departamento;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "cod_id_provincia")
	@ForeignKey(name = "GEN_MAE_SUCURSAL_FK03")
	private Provincia provincia;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "cod_id_distrito")
	@ForeignKey(name = "GEN_MAE_SUCURSAL_FK04")
	private Distrito distrito;
	@ManyToMany(cascade = CascadeType.ALL, mappedBy = "listaSucursal", fetch=FetchType.LAZY)
	private List<Supervisor> listaSupervisor;

	@Transient
	private boolean envioCorreo;
	
	public Sucursal() {

	}

	public Sucursal(Integer idSucursal, String nombre) {
		this.idSucursal = idSucursal;
		this.nombre = nombre;
	}

	public Sucursal(Integer idSucursal) {
		this.idSucursal = idSucursal;
	}

	public Integer getIdSucursal() {
		return idSucursal;
	}

	public void setIdSucursal(Integer idSucursal) {
		this.idSucursal = idSucursal;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDireccion() {
		return direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	public String getTelefono() {
		return telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public String getEsTaller() {
		return esTaller;
	}

	public void setEsTaller(String esTaller) {
		this.esTaller = esTaller;
	}

	public String getEsVentaRepuestos() {
		return esVentaRepuestos;
	}

	public void setEsVentaRepuestos(String esVentaRepuestos) {
		this.esVentaRepuestos = esVentaRepuestos;
	}

	public String getEsVentaVehiculos() {
		return esVentaVehiculos;
	}

	public void setEsVentaVehiculos(String esVentaVehiculos) {
		this.esVentaVehiculos = esVentaVehiculos;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public Date getFechaCreacion() {
		return fechaCreacion;
	}

	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}

	public Usuario getUsuarioCreacion() {
		return usuarioCreacion;
	}

	public void setUsuarioCreacion(Usuario usuarioCreacion) {
		this.usuarioCreacion = usuarioCreacion;
	}

	public Date getFechaModificacion() {
		return fechaModificacion;
	}

	public void setFechaModificacion(Date fechaModificacion) {
		this.fechaModificacion = fechaModificacion;
	}

	public Usuario getUsuarioModificacion() {
		return usuarioModificacion;
	}

	public void setUsuarioModificacion(Usuario usuarioModificacion) {
		this.usuarioModificacion = usuarioModificacion;
	}

	public Date getFechaEliminacion() {
		return fechaEliminacion;
	}

	public void setFechaEliminacion(Date fechaEliminacion) {
		this.fechaEliminacion = fechaEliminacion;
	}

	public Usuario getUsuarioEliminacion() {
		return usuarioEliminacion;
	}

	public void setUsuarioEliminacion(Usuario usuarioEliminacion) {
		this.usuarioEliminacion = usuarioEliminacion;
	}

	public Pais getPais() {
		return pais;
	}

	public void setPais(Pais pais) {
		this.pais = pais;
	}

	public Departamento getDepartamento() {
		return departamento;
	}

	public void setDepartamento(Departamento departamento) {
		this.departamento = departamento;
	}

	public Provincia getProvincia() {
		return provincia;
	}

	public void setProvincia(Provincia provincia) {
		this.provincia = provincia;
	}

	public Distrito getDistrito() {
		return distrito;
	}

	public void setDistrito(Distrito distrito) {
		this.distrito = distrito;
	}

	public List<Supervisor> getListaSupervisor() {
		return listaSupervisor;
	}

	public void setListaSupervisor(List<Supervisor> listaSupervisor) {
		this.listaSupervisor = listaSupervisor;
	}

	public boolean getEnvioCorreo() {
		return envioCorreo;
	}

	public void setEnvioCorreo(boolean envioCorreo) {
		this.envioCorreo = envioCorreo;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((idSucursal == null) ? 0 : idSucursal.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj){
			return true;
		}
		if (obj == null){
			return false;
		}
		if (getClass() != obj.getClass()){
			return false;
		}
		Sucursal other = (Sucursal) obj;
		if (idSucursal == null) {
			if (other.idSucursal != null){
				return false;
			}
		} else if (!idSucursal.equals(other.idSucursal)){
			return false;
		}
		return true;
	}

	@Override
	public String toString() {
		return idSucursal + Constantes.EMPTY;
	}
	
}